table是Lua中仅有的数据结构,具有强大的功能。table类型实现了关联数组(associative array)不仅可以通过整数来索引,还可以使用字符串或者其它类型的值(除了nil)来索引。此外table没有固定的大小,可以动态地添加任意数量的元素到一个table中。基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表(symbol table)、集合、记录、队列和其它数据结构。Lua也是通过table来表示模块(module)、包(package)和对象(object)的。当输入io.read的时候,其含义是"io模块的read函数"。对于Lua而言,这表示“使用字符串"read"作为key来索引table io“。

table是对象类型,程序仅持有一个对它的引用,Lua不会隐式的产生table的副本或者创建新的table。此外在lua中也不需要声明一个table。事实上也没有办法声明table。table的创建是通过构造表达式来完成的,最简单的构造表式就是{}。

创建table

table通过构造表达式来创建

tbl = {}  -- 创建一个空table,并将它的引用存储到tbl

tbl = {  -- 创建的同时填充table
    "Foo",
    "Bar",
    field1 = "value1",
    field2 = "value2",
    field3 = "value3",
    ["@field4"] = "value4" --如果table的key不符合Lua标示符的命名规范,在创建并填充table时使用["key"]这种语法
}

填充table

填充符合标示符规范的key时可以采用:tbl.field5 = "value5" 等同于`tbl["field5"] = "value5".
如果key不符合表示符的命名规范则需要使用`tbl[key] = value`这种语法才行,就像上面的"@field4".

访问table

table整数索引是从1开始的,这个跟其它语言都不一样。所以对于上面的table tbl

tbl[1]  -- "Foo"
tbl[2]  -- "Bar"
tbl.field1 -- "value1"
tbl["field2"] -- "value2"
tbl["@field4"] -- "value4"

tbl.key与tbl[key]的区别

Lua对于诸如tbl["key"]的写法提供了一种方便的语法糖,可以直接输入tbl.key
所以tbl["key] = 10等同与tbl.key = 10, print(tbl.key)等同于print(tbl["key"]
但是初学者容易将tbl.keytbl[key]搞错,前者表示tbl["key"], 以字符串"key"来索引table,而后者是以变量key来索引table。

获取table的长度

len = #tbl

追加元素到table

tbl[#tbl + 1] = "some value"

遍历table

for i, v in pairs(tbl) do
    print("index: " .. i, "value: : .. v)
end

pairs可以遍历整个table,而ipairs只能够访问整数索引的元素

table中要避免nil

Lua将nil作为界定数组结尾的标志。当table中含有nil的时候,长度操作符#会认为这些nil元素就是结尾标记.
所以我们在table中应该尽量避免包含nil.

a = {}
a[1000] = 1
print(#a, table.maxn(a)) --  0     1000


Kevin
5k 声望1.5k 粉丝